#!/bin/bash
###
 # @Description: 
 # @Version: 2.0
 # @Autor: gang
 # @Date: 2020-10-11 13:22:07
 # @LastEditors: gang
 # @LastEditTime: 2020-10-11 15:39:52
### 
export LANG="zh_CN.UTF-8"

path=/host/test #定义脚本存放路径

MAIL_GROUP="18838952961@163.com 1355528968@qq.com"

LOG_FILE="/tmp/web_check.log" #日志路径

USER=root #mysql用户名
PASSWORD=123456 #mysql密码
PORT=3306 #mysql端口号

MYSQLCMD="mysql -u${USER} -p${PASSWORD} -P${PORT}"

error=(1008 1007 1062)
RETVAL=0
[ ! -d "${path}" ] && mkdir -p ${path}

###
 # @description: 定义判断主从复制错误号函数
 # @param {type} 
 # @return {type} 
 # @author: gang
###
function JudgeError(){
    for (( i=0; i<${#error[*]} ; i++))
    do 
        if [ $i == ${error[$i]} ]
            then
            ${MYSQLCMD} -e "stop slave;set global sql_slave_skip_counter=1;start slave;"

        fi
    done
    return $1
}

###
 # @description: 定义检查数据库主从复制状态函数
 # @param {type} 
 # @return {type} 
 # @author: gang
###
function CheckDb(){
    status=($(awk -F ':' '/_Running|Last_Errno|_Bind/{print $NF}') slave.log)
    expr ${status[3]} + 1 &> /dev/null #这个是延迟状态值，用于进行是否为数字的判断
    if [ $? -ne 0 ]
        then
        status[3]=300 #赋值300，当数据库出现复制故障时，延迟这个状态值有可能是null，即非数字
    fi

    if [ "${status[0]}" == "Yes" -a "${status[1]}" == "Yes" -a "${status[3]}"  -lt 120 ]
        then #两个线程都为yes，并且延迟小于120秒，即认为复制状态都是正常的
        return 0
    else
        # 否则将错误码${status[2]}传入JudgeError函数，判断错误号是否可以自动修复
        JudgeError ${status[2]}
    fi
}

###
 # @description:  定义邮件函数
 # @param {type} 
 # @return {type} 
 # @author: gang
###
function Mail(){
    local SUBJECT_COUNTENT=$1 #将函数的第一个传参赋值给主题变量
    for mail_user in ${MAIL_GROUP}
    do
        mail -s "$SUBJECT_COUNTENT" $mail_user < ${LOG_FILE}
    done
}

###
 # @description: 发送短信
 # @param {type} 
 # @return {type} 
 # @author: gang
###
function SendMsg(){
    if [ $1 -ne 0 ]
    then
        $RETVAL=1
        NOW_TIME=`date +%F %T`
        SUBJECT_COUNTENT="mysql slave is error ,errorno is $2,${NOW_TIME}."
        echo -e "${SUBJECT_COUNTENT}" | tee ${LOG_FILE}  #输出信息，并记录到日志
        MAIL $SUBJECT_COUNTENT  #发邮件报警
        PAGER $SUBJECT_COUNTENT
    else
        echo "Mysql slave status is ok"
        RETVAL=0
        
    fi
    return $RETVAL
}

function main(){
    while true
    do
        CheckDb
        SendMsg $? #传入第一个参数“$?”,即CheckDb里的返回值（用监测失败的次数作为返回值）
        sleep 30
    done
}

main